
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import * as graphic from '../../util/graphic.js';
import { getECData } from '../../util/innerStore.js';
import * as layout from '../../util/layout.js';
import { wrapTreePathInfo } from '../helper/treeHelper.js';
import { curry, defaults } from 'zrender/lib/core/util.js';
import { convertOptionIdName } from '../../util/model.js';
import { toggleHoverEmphasis, Z2_EMPHASIS_LIFT } from '../../util/states.js';
import { createTextStyle } from '../../label/labelStyle.js';
var TEXT_PADDING = 8;
var ITEM_GAP = 8;
var ARRAY_LENGTH = 5;

var Breadcrumb =
/** @class */
function () {
	function Breadcrumb(containerGroup) {
		this.group = new graphic.Group();
		containerGroup.add(this.group);
	}

	Breadcrumb.prototype.render = function (seriesModel, api, targetNode, onSelect) {
		var model = seriesModel.getModel('breadcrumb');
		var thisGroup = this.group;
		thisGroup.removeAll();

		if (!model.get('show') || !targetNode) {
			return;
		}

		var normalStyleModel = model.getModel('itemStyle');
		var emphasisModel = model.getModel('emphasis');
		var textStyleModel = normalStyleModel.getModel('textStyle');
		var emphasisTextStyleModel = emphasisModel.getModel(['itemStyle', 'textStyle']);
		var layoutParam = {
			pos: {
				left: model.get('left'),
				right: model.get('right'),
				top: model.get('top'),
				bottom: model.get('bottom')
			},
			box: {
				width: api.getWidth(),
				height: api.getHeight()
			},
			emptyItemWidth: model.get('emptyItemWidth'),
			totalWidth: 0,
			renderList: []
		};

		this._prepare(targetNode, layoutParam, textStyleModel);

		this._renderContent(seriesModel, layoutParam, normalStyleModel, emphasisModel, textStyleModel, emphasisTextStyleModel, onSelect);

		layout.positionElement(thisGroup, layoutParam.pos, layoutParam.box);
	};
	/**
   * Prepare render list and total width
   * @private
   */

	Breadcrumb.prototype._prepare = function (targetNode, layoutParam, textStyleModel) {
		for (var node = targetNode; node; node = node.parentNode) {
			var text = convertOptionIdName(node.getModel().get('name'), '');
			var textRect = textStyleModel.getTextRect(text);
			var itemWidth = Math.max(textRect.width + TEXT_PADDING * 2, layoutParam.emptyItemWidth);
			layoutParam.totalWidth += itemWidth + ITEM_GAP;
			layoutParam.renderList.push({
				node: node,
				text: text,
				width: itemWidth
			});
		}
	};
	/**
   * @private
   */

	Breadcrumb.prototype._renderContent = function (seriesModel, layoutParam, normalStyleModel, emphasisModel, textStyleModel, emphasisTextStyleModel, onSelect) {
		// Start rendering.
		var lastX = 0;
		var emptyItemWidth = layoutParam.emptyItemWidth;
		var height = seriesModel.get(['breadcrumb', 'height']);
		var availableSize = layout.getAvailableSize(layoutParam.pos, layoutParam.box);
		var totalWidth = layoutParam.totalWidth;
		var renderList = layoutParam.renderList;
		var emphasisItemStyle = emphasisModel.getModel('itemStyle').getItemStyle();

		for (var i = renderList.length - 1; i >= 0; i--) {
			var item = renderList[i];
			var itemNode = item.node;
			var itemWidth = item.width;
			var text = item.text; // Hdie text and shorten width if necessary.

			if (totalWidth > availableSize.width) {
				totalWidth -= itemWidth - emptyItemWidth;
				itemWidth = emptyItemWidth;
				text = null;
			}

			var el = new graphic.Polygon({
				shape: {
					points: makeItemPoints(lastX, 0, itemWidth, height, i === renderList.length - 1, i === 0)
				},
				style: defaults(normalStyleModel.getItemStyle(), {
					lineJoin: 'bevel'
				}),
				textContent: new graphic.Text({
					style: createTextStyle(textStyleModel, {
						text: text
					})
				}),
				textConfig: {
					position: 'inside'
				},
				z2: Z2_EMPHASIS_LIFT * 1e4,
				onclick: curry(onSelect, itemNode)
			});
			el.disableLabelAnimation = true;
			el.getTextContent().ensureState('emphasis').style = createTextStyle(emphasisTextStyleModel, {
				text: text
			});
			el.ensureState('emphasis').style = emphasisItemStyle;
			toggleHoverEmphasis(el, emphasisModel.get('focus'), emphasisModel.get('blurScope'), emphasisModel.get('disabled'));
			this.group.add(el);
			packEventData(el, seriesModel, itemNode);
			lastX += itemWidth + ITEM_GAP;
		}
	};

	Breadcrumb.prototype.remove = function () {
		this.group.removeAll();
	};

	return Breadcrumb;
}();

function makeItemPoints(x, y, itemWidth, itemHeight, head, tail) {
	var points = [[head ? x : x - ARRAY_LENGTH, y], [x + itemWidth, y], [x + itemWidth, y + itemHeight], [head ? x : x - ARRAY_LENGTH, y + itemHeight]];
	!tail && points.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]);
	!head && points.push([x, y + itemHeight / 2]);
	return points;
} // Package custom mouse event.

function packEventData(el, seriesModel, itemNode) {
	getECData(el).eventData = {
		componentType: 'series',
		componentSubType: 'treemap',
		componentIndex: seriesModel.componentIndex,
		seriesIndex: seriesModel.seriesIndex,
		seriesName: seriesModel.name,
		seriesType: 'treemap',
		selfType: 'breadcrumb',
		nodeData: {
			dataIndex: itemNode && itemNode.dataIndex,
			name: itemNode && itemNode.name
		},
		treePathInfo: itemNode && wrapTreePathInfo(itemNode, seriesModel)
	};
}

export default Breadcrumb;